#ifndef _APP_HALEXVSTEPMOTOR_H_
#define _APP_HALEXVSTEPMOTOR_H_

#include "App.h"

/*************************************************************
* Module define Variable
*************************************************************/
#define U8_STEP_INTERVAL_TIM    (25)    //上电延时100ms后获取复位开度
#define U16_STEP_START_TIM      (1000)   //动作前励磁时间（计时单位500us）
#define U16_STEP_END_TIM        (2000)   //动作后励磁时间

enum
{//驱动方向
    U8_STEP_DIRE_OPEN = 0,  //正向
    U8_STEP_DIRE_CLOSE,     //反向
};

enum
{//工作状态
    U8_STEP_STA_IDLE = 0,   //空闲
    U8_STEP_STA_BUSY,       //工作
};

enum
{//驱动设备个数
    U8_HALMOTOR_CHN0 = 0,
    U8_HALMOTOR_CHN1,
    U8_HALMOTOR_CHN2,
    U8_HALMOTOR_MAX,
};

/*************************************************************
* Module Input Variable
*************************************************************/
#define HalStepMotorIn_s16Chn0Pls       (sint16)(stExvOutputVar.u16ExvTrgtPulse)    //目标步数
#define HalStepMotorIn_u8Chn0Spd        (stExvOutputVar.u8ExvSpd)                   //励磁速度
#define HalStepMotorIn_s16Chn0Closepls  (stExvOutputVar.s16ExvClosepls)             //多关步数 驱动设备为膨胀阀则需要填关阀清零多关步数，步进电机根据实际需求填
#define HalStepMotorIn_u8Chn0Type       (0)                                         //设备类型 0：阀 1：步进电机
#define HalStepMotorIn_u8Chn0DrvType    (0)                                         //0：从左往右为开 1：从右往左为开
#define HalStepMotorIn_s16Chn0RstPls    (sint16)(eIduParamet.eSysVar.u16EVI_INIT_POWER) //上电复位开度

#define HalStepMotorIn_s16Chn1Pls       (MidStepOut.u16_target_degree)
#define HalStepMotorIn_u8Chn1Spd        (MidStepOut.u8AswingSpd*2)
#define HalStepMotorIn_s16Chn1Closepls  (0)
#define HalStepMotorIn_u8Chn1Type       (1)
#define HalStepMotorIn_u8Chn1DrvType    (1)
#define HalStepMotorIn_s16Chn1RstPls    (STEP_RESET_MAX)                           

#define HalStepMotorIn_s16Chn2Pls       (MidStepOut.u16CswingTarget)
#define HalStepMotorIn_u8Chn2Spd        (MidStepOut.u8CswingSpd*2)
#define HalStepMotorIn_s16Chn2Closepls  (0)
#define HalStepMotorIn_u8Chn2Type       (1)
#define HalStepMotorIn_u8Chn2DrvType    (0)
#define HalStepMotorIn_s16Chn2RstPls    (CSTEP_RESET_MAX)

/*************************************************************
* Struct in File
*************************************************************/
typedef struct//输入
{
    sint16 s16InTargPls;      //目标步数
    sint16 s16InClosePls;     //关阀清零步数（仅阀需要用到）
    uint8  u8InDrvSpeedSet;   //励磁速度设置
    uint8  u8InStepType;      //0：阀 1：步进电机
    uint8  u8DrvDirType;      //是否需要反向驱动 0：从左往右为开 1：从右往左为开
    sint16 s16ResetPls;       //复位开度
}ST_APP_STEP_INPUT;

typedef struct//参数
{
    sint16 s16TargPls;      //目标步数
    sint16 s16CurPls;       //当前步数
    sint16 s16ClosePls;     //关阀清零步数（仅阀需要用到）
    uint16 u16PaceHoldTim;   //电平维持时间
    uint8  u8DrvSpeedTim;   //励磁计时
    uint8  u8DrvDire;       //驱动方向
    uint8  u8StepDrvCnt;    //线序数据坐标
    uint8  u8InitTim;       //上电初始化等待延时
    uint8  u8StepType;      //0：阀 1：步进电机
    uint8  u8OnceDrvOver;   //是否完成单次励磁
}ST_APP_STEP_PARA;

/*************************************************************
* Module Output Variable
*************************************************************/
typedef struct
{
    uint16 u16CurPlsOut;    //当前步数
    sint16 s16PortLev;      //输出电平
    uint8  u8ExvBusy;       //状态 0：空闲 1：动作
    uint8  u8RstFinish;     //上电复位状态 0：未完成 1：完成
    uint8  u8PowerOnInit;   //是否需要执行复位标志
}ST_APP_STEP_OUTPUT;
extern ST_APP_STEP_OUTPUT stStepOut[U8_HALMOTOR_MAX];

/*************************************************************
* Function in Project
*************************************************************/
extern void HalStepCtrl(void);
extern void HalStepInit(void);
extern void HalStepSpeed(void);
#endif

